\documentclass[UTF8]{ctexart}

\usepackage{graphicx}
\usepackage{amsmath}
\usepackage{amssymb}

\title{数值分析编程报告（2.9.2）}
\author{邵柯欣 \\学号：3200103310 \\信息与计算科学}
\begin{document}
\maketitle

\section{文件使用}
\subsection{Makfile}
在终端输入$\verb|make|$，生成可执行文件$B, C, D, E$分别为题目$B, C, D, E$的解法，并执行对应的可执行文件，将结果写入$data.txt$文件。\par
在终端输入$\verb|make python|$，运行$python$文件$B.py, C.py, D.py, E.py$生成图片，并将图片存入$\verb|../report/Fig|$文件夹中，供报告使用。\par
在终端输入$\verb|make clean|$，删除生成的可执行文件$B, C, D, E$和数据文件$data.txt$。
\subsection{Interpolation.h}
包含函数（$\verb|poly, poly_diff, getvalues|$）和类（$\verb|Function, Newton|$）。\par
\subsubsection{函数poly}
\begin{verbatim}
double poly(vector<double> X, double x, int m)
{
    double s = 1;
    for (int i = 0; i <= m;i++)
    {
	s = s*(x-X[i]);
    }
    return s;
};
\end{verbatim}
输入向量${x_i}$、自变量$x$、阶数$m$，输出$(x-x_0)*(x-x_1)*...*(x-x_{m-1})$的值。
\subsubsection{函数poly-diff}
\begin{verbatim}
double poly_diff(vector<double> X, double x, int m)
{
    double d = 0;
    double s = poly(X, x, m);
    for (int i = 0; i <= m; i++)
    {
	d = d + s/(x-X[i]);
    }
    return d;
};
\end{verbatim}
输入向量${x_i}$、自变量$x$、阶数$m$，输出$(x-x_0)*(x-x_1)*...*(x-x_{m-1})$的导数值，即$\sum \limits^{m-1}_{i = 0}\dfrac{\prod \limits^{m-1}_{j=0}(x-x_j)}{x-x_i}$。
\subsubsection{函数getvalues}
\begin{verbatim}
vector<double> getvalues(vector<double> X, Function &f)
{
    int n = X.size() - 1;
    vector<double> Y;
    Y.resize(n+1);
    for (int i = 0; i <= n; i++)
    {
	Y[i] = f(X[i]);
    };
    return Y;
};
\end{verbatim}
输入向量${x_i}$、函数$f$，输出对应的函数值向量${f(x_i)}$的导数值。
\subsubsection{虚类Function}
定义函数的虚类，用于规范函数类。
\begin{verbatim}
class Function
{
public:
    virtual double operator()(double _x) = 0;
    virtual double diff(double _x){return 0;};    
};
\end{verbatim}
\subsubsection{类Newton}
牛顿插值的实现算法：
\begin{verbatim}
class Newton
{
private:
    vector<double> X,Y;
    vector<vector<double>> f;
public:
    Newton(vector<double>& X, vector<double>& Y)
	: X(X), Y(Y){};
    double operator ()(const double x) const{};
    double diff(double x){};
    void printF(){};
};
\end{verbatim}
$f[i]$用于存储向量$f[x_0, ..., x_{i}], f[x_1, ..., x_{i+1}], ..., f[x_{n-i}, ...,x_n]$。\par
$\verb|Newton NI|$生成名为NI的Newton类，使用$\verb|NI(x)|$输出插值函数在x处的值，使用$\verb|NI.diff(x)|$输出插值函数在x处的导数值，使用$\verb|NI.printF|$输出所有的$f[x_0, ..., x_i]$。
\subsection{*.py}
画图的python代码。
\subsection{*.cpp}
分别输出题目$B, C, D, E$所求插值的$X, Y, f[x_0, ...,x_i]$。
\section{题目解法}
\subsection{$B, C$}
定义了两个函数$F1,F2$，$F1$用来对应题目中的$f(x)$，F2用来根据不同的n生成向量X。\par
对每一组向量X，用$getvalues$函数生成Y。\par
对每一个n对应的一对向量$X,Y$生成名为$NI$的Newton类，使用$NI.printF()$输出$f[x_0, ...,x_i]$。\par
根据输出数据中多组的$f[x_0], f[x_0, x_1], ...,f[x_0, ...,x_n]$编写python画图代码得到对应图片。
\begin{figure}
  \centering
  \includegraphics[width=.8\textwidth]{./Fig/B.png}
  \caption{B.png}
\end{figure}
\begin{figure}
  \centering
  \includegraphics[width=.8\textwidth]{./Fig/C.png}
  \caption{C.png}
\end{figure}

\subsection{D}
将时间、距离、速度数据，分别储存到向量$T,D,S$中。\par
定义向量$X,Y$，其中$X[2*i] = X[2*i+1] = T[i], Y[2*i] = D[i], Y[2*i+1] = S[i], i \in {0, 1, ..., 4}$。\par
对向量$X,Y$生成名为$NI$的Newton类，使用$NI.printF()$输出$f[x_0, ...,x_i]$。\par
使用$NI.diff(10)$输出在 t = 10时的速度 Speed = 48.3817。\\
根据输出数据中的$f[x_0], f[x_0, x_1], ...,f[x_0, ...,x_n]$编写python画图代码，得到距离曲线图片D（a）和速度曲线图片D（b）。\\
同时在图D（b）中加入直线S=81，可见速度有超过55 mi/h(81 feet per second)的限速。
\begin{figure}
  \centering
  \includegraphics[width=.8\textwidth]{./Fig/D_a.png}
  \caption{D(a).png}
\end{figure}
\begin{figure}
  \centering
  \includegraphics[width=.8\textwidth]{./Fig/D_b.png}
  \caption{D(b).png}
\end{figure}

\subsection{E}
将天数、第一组的平均重量、第二组的平均重量信息，分别储存到向量$D,Sp1,Sp2$中。\par
对向量$D,Sp1$和向量$D,Sp2$分别生成名为$N1, N2$的Newton类，使用$N1.printF(),N2.printF$分别输出对应的$f[x_0, ...,x_i]$。\par
根据输出数据中的两组$f[x_0], f[x_0, x_1], ...,f[x_0, ...,x_n]$编写python画图代码得到对应图片E(a)。\\
同时在E(a)的基础上向右扩大天数的取值范围得到图E(b)，以观察两个样本是否会在接下来的十五天中死亡，结果是都不会。
\begin{figure}
  \centering
  \includegraphics[width=.8\textwidth]{./Fig/E_a.png}
  \caption{E(a).png}
\end{figure}
\begin{figure}
  \centering
  \includegraphics[width=.8\textwidth]{./Fig/E_b.png}
  \caption{E(b).png}
\end{figure}

\end{document}
